<?php
namespace Model;
use ORM\ORMOrder;
use LSYS\ORM;
use LSYS\ORMCache\Lists\CacheSet;
use LSYS\ORMCache\Lists\CacheGet;
use LSYS\Param\WhereParam;
use LSYS\Param\SortParam;
use LSYS\Param\PageParam;
// 本类为MODEL示例,你完全不需要按此规则编写你的MODEL
// 由于单层继承原因,为了方便集成到其他框架或其他代码,分成了 接口 Lists 接口和 ShareTrait 片段实现
// 现在一般框架都会有一个抽象MODEL类,你在你框架的model加上实现lists接口即可
// 列表实现cache 封装,不使用列表缓存,不赋值 _list_cache,使用只需赋值 _list_cache 属性即可,单需要在跟新数据时跟新列表数据.如下面示例
// 对于
class OrderModel{
	/**
	 * @return CacheGet
	 */
	protected $_list_cache=null;
	/**
	 * @return ORMOrder
	 */
	protected $_share_orm=null;
	public function __construct(){
		//赋值列表操作属性,此为必须的...
		$this->_share_orm= new ORMOrder();
		//以下赋值非必须,使用列表缓存赋值以下属性,以下为列表集存储于Redis中
		//还有一个 sphinx 数据索引的方式
		//加上缓存可以有效的减轻对数据库的访问操作
		//如MYSQL记录量大时,取偏移量大数据慢,可以加此方式解决..
		$this->_list_cache= new \LSYS\ORM\Lists\Cache\Redis($this->_share_orm);
	}
	//定义成常量,方便外部操作
	/**
	 * //列表条件常量
	 * @var integer
	 */
	const LIST_WHERE_SN=1;
	//列表排序常量
	const LIST_SORT_ID_DESC=1;
	const LIST_SORT_ID_ASC=2;
	
	/**
	 * get list method
	 * @param array $where
	 * @param string $sort
	 * @param number $offset
	 * @param number $limit
	 * @return Result
	 */
	public function lists(WhereParam $where,SortParam $sort,PageParam $page){
		$list_cache=$this->_list_cache;
		if ($list_cache instanceof CacheSet){
			$result=$list_cache->lists_get($where,$sort,$offset,$limit);
			if ($result instanceof Result) return $result;
		}
		$orm=$this->_share_orm;
		$orm->reset();
		$this->_lists_where($orm,$where);
		$this->_lists_sort($orm,$where);
		$result=$orm->offset($offset)->limit($limit)->find_all();
		if ($list_cache instanceof CacheSet){
			$list_cache->lists_set($where, $sort, $offset, $limit, $result);
		}
		return $result;
	}
	/**
	 * get list total method
	 * @param array $where
	 * @return number
	 */
	public function lists_total(WhereParam $where){
		$list_cache=$this->_list_cache;
		if ($list_cache instanceof CacheGet){
			$total=$list_cache->lists_total_get($where->get());
			if ($total!==false&&$total!==null) return $total;
		}
		$orm=$this->_share_orm->reset();
		$this->_lists_where($orm,$where);
		$total = $this->count_all();
		if ($list_cache instanceof CacheGet){
			$list_cache->lists_total_set($where->get(), $total);
		}
		return $total;
	}
	/**
	 * 重写片段中 _lists_where 实现你的数据过滤规则
	 * @param ORM $orm
	 * @param array $where
	 */
	private function _lists_where(ORM $orm,WhereParam $where){
		foreach ($where as $k=>$v){
			switch ($k) {
				case self::LIST_WHERE_SN:
					$orm->where('sn','=',intval($v));
				break;
			}
		}
	}
	/**
	 * 重写片段中 _lists_sort 实现你的数据排序规则
	 * @param ORM $orm
	 * @param array $where
	 */
	private function _lists_sort(ORM $orm,array $sort){
		switch ($sort){
			case self::LIST_SORT_ID_ASC:
				$orm->order_by("id_order","asc");
				break;
			case self::LIST_SORT_ID_DESC:
				$orm->order_by("id_order","desc");
				break;
		}
	}
	//当你使用列表缓存,为了数据的动态更新,需要在你的以下操作添加数据更新
	//以下方法名你根据需求定,以下只是作为示例
	public function add($data){//这里的add 方法名你喜欢改成什么就改成什么
		$entity=null;//数据添加更新缓存
		$this->_list_cache->lists_insert($entity);
	}
	public function edit($data){//这里的edit 方法名你喜欢改成什么就改成什么
		$new_entity=null;//数据修改更新缓存
		$this->_list_cache->lists_update($new_entity);
	}
	public function del($data){//这里的del 方法名你喜欢改成什么就改成什么
		$entity=null;//数据删除更新缓存
		$this->_list_cache->lists_delete($entity);
	}
}

